import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getUserProfile, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'
const state = {
  // 共享token状态
  token: getToken(), // 从缓存中读取，初始化的时候，缓存中没有就是没有
  // 共享用户的基本资料
  userInfo: {}
}
const mutations = {
  // 更新token,setToken就是起的名字
  setToken(state, payload) {
    state.token = payload // 更新token数据
    //  同步更新到本地缓存，这个setToken指的是import中导入的setToken
    setToken(payload)
  },
  // 退出登录的时候应该清除vuex中的token 同步清除本地缓存的token
  removeToken(state) {
    state.token = null // 清除vuex中的token
    removeToken() // 清除缓存中的token
  },
  // 设置用户资料
  setUserInfo(state, userInfo) {
    // 响应式更新
    state.userInfo = { ...userInfo }
  },
  // 删除用户的基本资料
  removeUserInfo(state) {
    state.userInfo = {}
  }
}

const actions = {
  // 封装一个登录的action
  async login(context, data) {
    const result = await login(data)
    //  axios默认给返回体加了一层data
    // if (result.data.success) {
    // 如果为true表示登陆成功  取返回的token
    // context.commit('setToken', result.data.data)
    context.commit('setToken', result)
    // 认为登录成功  写入时间戳
    setTimeStamp()
    // }
  },
  // 获取用户信息
  async getUserInfo(context) {
    // 得到的result是被响应拦截器解构过得
    const result = await getUserProfile()

    const detailResult = await getUserDetailById(result.userId) // 获取用户信息的id

    context.commit('setUserInfo', { ...result, ...detailResult }) // 提交mutations
    return result
  },
  logout(context) {
    context.commit('removeUserInfo')
    context.commit('removeToken')
    // 重置路由
    resetRouter() // 重置路由
    // 重置Vuex的路由数据
    // vuex加了命令空间的子模块 怎么调用另外一个子模块
    context.commit('permission/setRoutes', [], { root: true })
    // 表示root:true commit实际是用顶级调用方式
  }

}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
